'''
格式 with context [as var]:
    pass
'''
# f = open('a.txt', 'a')
# a = 'content\n'
# f.write(a)
# f.close()

with open('a.txt') as file:
  print('txt content:', file.read())
print(file.closed)  # with 语句中不需要close

#  with本身并没有异常捕获的功能, 发生异常也会释放文件资源

# with open('aaaa.txt') as file2:
#     print(file2.read())
# print(file2.closed)

"""
with 语句实质是上下文管理。
1、上下文管理协议。包含方法__enter__() 和 __exit__()，支持该协议对象要实现这两个方法。
2、上下文管理器，定义执行with语句时要建立的运行时上下文，负责执行with语句块上下文中的进入与退出操作。
3、进入上下文的时候执行__enter__方法，如果设置as var语句，var变量接受__enter__()方法返回值。
4、如果运行时发生了异常，就退出上下文管理器。调用管理器__exit__方法。
"""


# 自定义类必须包含上述几个方法才能正确使用with关键字。
class MyContext(object):
  def __init__(self, name):
    self.name = name

  def __enter__(self):
    print("进入enter")
    return self

  def do_self(self):
    print(self.name)

  def __exit__(self, exc_type, exc_value, traceback):
    print("退出exit")
    print(exc_type, exc_value)


if __name__ == '__main__':
  with MyContext('test') as mc:
    mc.do_self()
